/* 
 * DataBaseInfo.java 
 * 
 * Copyright 2009 Handlewell Beijing Inc. 
 * All rights reserved. 
 * 
 * Created on 2009-8-24 
 */
package com.handlewell.generator.support;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 功能概述： <br>
 * 
 * 数据库信息
 * 
 * @author 倪敏
 * 
 */
public class DBUtils {
	private HashMap<String, String> db;

	public DBUtils(HashMap<String, String> db) {
		this.db = db;
	}

	private Connection getConnection() {
		try {
			Class.forName(db.get(Constraints.driverClass));
			Connection conn = DriverManager.getConnection(db
					.get(Constraints.url), db.get(Constraints.user), db
					.get(Constraints.password));
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public List<TableColumns> getTable(String tablename, boolean needSchema) {

		List<TableColumns> tcList = new ArrayList<TableColumns>();
		Connection conn = getConnection();
		try {
			// DatabaseMetaData对象用于获取数据库管理系统的各种信息
			// 包括数据库中的各个表，表中各个列，数据类型等各方面的信息
			DatabaseMetaData dbMetaData = conn.getMetaData();
			// 要获得表所在的编目。串“""”意味着没有任何编目，null表示所有编目。
			String catalog = null;
			// 要获得表所在的模式。串“""”意味着没有任何模式，null表示所有模式。该参数可以包含单字符的通配符（“_”）,也可以包含多字符的通配符（“%”）。
			String schema = null;
			if (needSchema) {
				schema = db.get(Constraints.user).toUpperCase();
			}
			// 指出要返回表名与该参数匹配的那些表，该参数可以包含单字符的通配符（“_”）,也可以包含多字符的通配符（“%”）。
			String tableName = tablename.toUpperCase();

			String prikeyCol = null;
			// 主键列
			ResultSet prikey = dbMetaData.getPrimaryKeys(catalog, schema,
					tableName);
			if (prikey.next()) {
				// 获得列名
				prikeyCol = prikey.getString("COLUMN_NAME");
			}
			// 所有列
			ResultSet dbCols = dbMetaData.getColumns(catalog, schema,
					tableName, null);

			TableColumns tc = null;
			while (dbCols.next()) {
				tc = new TableColumns();
				tc.setTableName(tableName);
				// 设置主键
				if (prikeyCol.equals(dbCols.getString("COLUMN_NAME"))) {
					tc.setPrikey(true);
				}
				// 设置其他内容
				tc.setDbColumnName(dbCols.getString("COLUMN_NAME"));

				// 属性字段转换（例如：USER_NAME转换成user_name）
				String colName = dbCols.getString("COLUMN_NAME").toLowerCase();
				StringBuffer buffer = new StringBuffer();
				char[] c = colName.toCharArray();
				for (int i = 0; i < c.length; i++) {
					if (c[i] == '_') {
						buffer.append(String.valueOf(c[++i]).toUpperCase());
					} else {
						buffer.append(c[i]);
					}
				}

				// tc.setColumnName(buffer.toString());
				tc.setColumnName(colName);
				tc.setColumnType(dbCols.getString("TYPE_NAME"));

				// 属性字段类型设置
				if (tc.getColumnType().equalsIgnoreCase("INTEGER")
						|| tc.getColumnType().equalsIgnoreCase("INT")
						|| tc.getColumnType().equalsIgnoreCase("SMALLINT")) {
					tc.setJavaType("Long");
				} else if (tc.getColumnType().equalsIgnoreCase("NUMBER")) {
					tc.setJavaType("Long");
				} else if (tc.getColumnType().equalsIgnoreCase("VARCHAR2")
						|| tc.getColumnType().equalsIgnoreCase("VARCHAR")) {
					tc.setJavaType("String");
				} else if (tc.getColumnType().equalsIgnoreCase("DATE")
						|| tc.getColumnType().equalsIgnoreCase("TIMESTAMP")
						|| tc.getColumnType().equalsIgnoreCase("DATETIME")) {
					tc.setJavaType("Date");
				} else if (tc.getColumnType().equalsIgnoreCase("FLOAT")) {
					tc.setJavaType("Float");
				} else if (tc.getColumnType().equalsIgnoreCase("DOUBLE")) {
					tc.setJavaType("Double");
				}else {
					tc.setJavaType("Object");
				}

				// 其他
				tc.setColumnSize(dbCols.getInt("COLUMN_SIZE"));
				tc.setColumnDecimalDigits(dbCols.getInt("DECIMAL_DIGITS"));
				tc.setRemark(dbCols.getString("REMARKS"));
				if ("YES".equalsIgnoreCase(dbCols.getString("IS_NULLABLE"))) {
					tc.setNullable(true);
				} else {
					tc.setNullable(false);
				}

				// 设置中文名称--add by wangfeng 20120703
				Statement st = conn.createStatement();
				String sql = "select * from tool_column_ch_name where qualified_name='"
						+ tableName
						+ "."
						+ tc.getDbColumnName().toUpperCase()
						+ "'";
				ResultSet rs = st.executeQuery(sql);
				if (rs.next()) {
					tc.setColumnZhName(rs.getString("ZH_NAME"));
				}
				tcList.add(tc);
			}
		} catch (SQLException e) {
			System.out.println("读取数据库表结构出现异常");
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
			}
		}

		return tcList;
	}
}
